package com.ktwlsoft.archivemanage.domain.business.repositoryService;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.ktwlsoft.archivemanage.domain.dao.entity.ArchiveUnit;
import com.ktwlsoft.archivemanage.domain.dao.entity.ArchiveUnitDetail;
import com.ktwlsoft.archivemanage.domain.dao.repository.IArchiveUnitMapper;
import com.ktwlsoft.archivemanage.payload.Result;
import com.ktwlsoft.archivemanage.payload.ResultType;
import com.ktwlsoft.archivemanage.payload.security.ArchiveUnitResponse;
import com.ktwlsoft.archivemanage.payload.unitArchive.UnitAndArchivist;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * archive_unit--立档单位业务层接口实现类
 *
 * @author zhuhe on 2019-10-24 14:19:39
 * @version 1.0
 */
@Service
public class ArchiveUnitRepositoryService {

    private final IArchiveUnitMapper archiveUnitMapper;

    public ArchiveUnitRepositoryService(IArchiveUnitMapper archiveUnitMapper) {
        this.archiveUnitMapper = archiveUnitMapper;
    }

    /**
     * 查询分页 on 2019-10-24 14:19:39
     *
     * @param pn          第几页
     * @param pageSize    每页多少条
     * @param archiveUnit archiveUnit
     * @return PageInfo<ArchiveUnit>
     */
    public PageInfo<ArchiveUnit> findPage(int pn, int pageSize, ArchiveUnit archiveUnit) {
        PageHelper.startPage(pn, pageSize);
        PageInfo<ArchiveUnit> pageInfo = new PageInfo<ArchiveUnit>(archiveUnitMapper.findList(archiveUnit));
        return pageInfo;
    }

    /**
     * 查询集合 on 2019-10-24 14:19:39
     *
     * @param archiveUnit archiveUnit
     * @return List<ArchiveUnit>
     */
    public List<ArchiveUnit> findList(ArchiveUnit archiveUnit) {
        return archiveUnitMapper.findList(archiveUnit);
    }

    /**
     * 查询下拉集合 on 2019-10-24 14:19:39
     *
     * @param jsonObject jsonObject
     * @return List<ArchiveUnit>
     */
    public List<JSONObject> findListAll(JSONObject jsonObject) {
        return archiveUnitMapper.findListAll(jsonObject);
    }

    /**
     * 根据ID查询信息 on 2019-10-24 14:19:39
     *
     * @param id 主键
     * @return ArchiveUnit
     */
    public ArchiveUnit getById(Long id) {
        return archiveUnitMapper.getById(id);
    }

    /**
     * 根据账号id查询信息 on 2019/10/31 12:13
     *
     * @param accountId accountId
     * @return ArchiveUnit
     */
    public ArchiveUnit getByAccountId(Long accountId) {
        return archiveUnitMapper.getByAccountId(accountId);
    }

    /**
     * 根据账户查询信息 on 2019-10-24 14:19:39
     *
     * @param account account
     * @return ArchiveUnit
     */
    public ArchiveUnit getByAccount(String account) {
        return archiveUnitMapper.getByAccount(account);
    }

    /**
     * 新增 on 2019-10-24 14:19:39
     *
     * @param archiveUnit archiveUnit
     * @return int
     */
    public int insert(ArchiveUnit archiveUnit) {
        return archiveUnitMapper.insert(archiveUnit);
    }

    /**
     * 修改 on 2019-10-24 14:19:39
     *
     * @param archiveUnit archiveUnit
     * @return int
     */
    public int update(ArchiveUnit archiveUnit) {
        return archiveUnitMapper.update(archiveUnit);
    }

    /**
     * 根据id集合批量删除信息 on 2019-10-24 14:19:39
     *
     * @param archiveUnitArr 主键编号集合
     * @return int
     */
    public int deleteByIds(List<Long> archiveUnitArr) {
        return archiveUnitMapper.deleteByIds(archiveUnitArr);
    }

    /**
     * 根据id删除信息 on 2019-10-24 14:19:39
     *
     * @param id id
     * @return int
     */
    public int deleteById(Long id) {
        return archiveUnitMapper.deleteById(id);
    }

    /**
     * 重写findPagedList方法
     *
     * @param pn       页面号码
     * @param pageSize 页面大小
     * @param data     查询条件
     * @return PageInfo<archiveUnit>
     * @description 分页查询立档单位列表
     */
    public PageInfo<ArchiveUnitDetail> findPagedList(int pn, int pageSize, Map<String, Object> data) {
        PageInfo<ArchiveUnitDetail> pageInfo = new PageInfo<>();
        if ("allLevels".equals(data.get("unitLevel").toString()) || "firstLevel".equals(data.get("unitLevel").toString())) {
            data.put("type",1);
            pageInfo = findAllLevelsUp(pn,pageSize,data);
            if(pageInfo.getList() != null && pageInfo.getList().size() > 0){
                for(ArchiveUnitDetail detail:pageInfo.getList()){
                    detail.setSubUnitList(archiveUnitMapper.findSubArchiveUnitList(detail.getId()));
                }
            }
        }else if("secondLevel".equals(data.get("unitLevel").toString())){
            data.put("type",1);
            data.put("state",1);
            pageInfo = findAllLevelsUp(pn,pageSize,data);
            if(pageInfo.getList() != null && pageInfo.getList().size() > 0){
                for(ArchiveUnitDetail detail:pageInfo.getList()){
                    Map<String, Object> itemData = new HashMap<>();
                    itemData.put("pId",detail.getId());
                    itemData.put("conditions",data.get("conditions"));
                    detail.setSubUnitList(archiveUnitMapper.findSubByUnitName(itemData));
                }
            }
        }
        return pageInfo;
    }

    private PageInfo<ArchiveUnitDetail> findAllLevelsUp(int pn, int pageSize, Map<String, Object> data){
        PageHelper.startPage(pn,pageSize);
        return new PageInfo<>(archiveUnitMapper.findAllArchiveUnitList(data));
    }

    /**
     * @param pn       页面号码
     * @param pageSize 页面大小
     * @param unitId   立档单位id
     * @return PageInfo<ArchiveUnitDetail>
     * @description 分页查询下级立档单位列表
     */
    public PageInfo<ArchiveUnitDetail> findSubPagedList(int pn, int pageSize, Long unitId) {
        PageHelper.startPage(pn, pageSize);
        return new PageInfo<ArchiveUnitDetail>(archiveUnitMapper.findSubArchiveUnitList(unitId));
    }

    /**
     * @param unitId 立档单位id
     * @return List<ArchiveUnitDetail>
     * @description 查询所有下级立档单位列表
     */
    public List<ArchiveUnitDetail> findSubArchiveUnitList(Long unitId) {
        return archiveUnitMapper.findSubArchiveUnitList(unitId);
    }

    /**
     * @param pn       第几页
     * @param pageSize 每页条数
     * @param data     查询条件数据
     * @return PageInfo<ArchiveUnitDetail>
     * @description 查询所有立档单位列表
     */
    public PageInfo<ArchiveUnitDetail> findAllArchiveUnitList(int pn, int pageSize, Map<String, Object> data) {
        PageHelper.startPage(pn, pageSize);
        List<ArchiveUnitDetail> list = archiveUnitMapper.findAllArchiveUnitList(data);
        PageInfo<ArchiveUnitDetail> pageInfo = new PageInfo<ArchiveUnitDetail>(list);
        return pageInfo;
    }

    /**
     * @param unitId 立档单位id
     * @return ArchiveUnitDetail
     * @description 根据立档单位id查询立档单位信息
     */
    public ArchiveUnitDetail findArchiveUnitInfoById(Long unitId) {
        return archiveUnitMapper.findArchiveUnitInfoById(unitId);
    }

    /**
     * @param unitName 立档单位名称
     * @return Integer
     * @description 根据立档单位名称查询
     */
    public Integer findByUnitName(String unitName) {
        return archiveUnitMapper.findByUnitName(unitName);
    }

    /**
     * @param archiveUnit 立档单位数据
     * @return Result
     * @description 新增立档单位信息
     */
    public int addArchiveUnitInfo(ArchiveUnit archiveUnit) {
        return archiveUnitMapper.addArchiveUnitInfo(archiveUnit);
    }

    /**
     * @param archiveUnit 上级立档单位数据
     * @return Result
     * @description 新增上级立档单位信息
     */
    public Result addParentArchiveUnitInfo(ArchiveUnit archiveUnit) {
        archiveUnitMapper.addParentArchiveUnitInfo(archiveUnit);
        return Result.body(null, ResultType.BUSINESS_SUCCESS).withMessage("新增上级立档单位信息成功");
    }

    /**
     * @param archiveUnit 立档单位数据
     * @return int
     * @description 更新立档单位信息
     */
    public int updateArchiveUnitInfo(ArchiveUnit archiveUnit) {
        return archiveUnitMapper.updateArchiveUnitInfo(archiveUnit);
    }

    /**
     * @param parentArchiveUnit 立档单位数据
     * @return int
     * @description 更新立档单位信息
     */
    public int updateParentArchiveUnitInfo(ArchiveUnit parentArchiveUnit) {
        return archiveUnitMapper.updateArchiveUnitInfo(parentArchiveUnit);
    }

    /**
     * @param unitId 立档单位id
     * @return Result
     * @description 删除立档单位信息
     */
    public int deleteArchiveUnitInfo(Long unitId) {
        return archiveUnitMapper.deleteArchiveUnit(unitId);
    }

    public ArchiveUnitResponse findArchiveUnitResponse(String account) {
        return archiveUnitMapper.findArchiveUnitResponse(account);
    }

    public boolean existByUnitAccountOrTele(String unitAccountOrTele) {
        return archiveUnitMapper.existByUnitAccountOrTele(unitAccountOrTele) != null;
    }

    public List<UnitAndArchivist> findByQuestionTitle(String title) {
        return archiveUnitMapper.findByQuestionTitle(title);
    }
}
